		/*
 * mapping.c
 *
 *  Created on: 27/09/2011
 *      Author: utn_so
 */

#include "mapping.h"

t_chs *obtenerCHS(int sector){
	t_chs *direccion;
	t_config *config = getConfig();

	direccion->cilindro = sector / (config->sectores * config->cabezas);

	direccion->cabeza = (sector % (config->sectores * config->cabezas)) / (config->sectores);

	direccion->sector = ((sector % (config->sectores * config->cabezas)) % (config->sectores));

	return direccion;
}

uint32_t obtenerCHSlog(t_chs *chsInfo){

	t_config *config = getConfig();
	return (chsInfo->sector + chsInfo->cabeza * config->sectores
			+ chsInfo->cilindro * config->cabezas * config->sectores);
}

t_chs *actualizarCHS(t_chs *chsActual, uint32_t cantidad){
	t_config *config = getConfig();
	t_chs *chsActualiz;
	chsActualiz = chsActual;

	if (chsActualiz->sector + cantidad >= config->sectores){
		chsActualiz->sector = config->sectores - (chsActualiz->sector + cantidad);
	}
	else {
		chsActualiz->sector += cantidad;
	}

	return chsActualiz;
}

int8_t abrirArchivo() {

	int8_t archivo;
	uint16_t sizeofpage;
	t_config *config = getConfig();
	archivo = open(PATH, O_RDWR);
	if (archivo < 0) {
		perror("No se puede abrir el archivo");
	};
	sizeofpage = getpagesize();
	posix_madvise(NULL, sizeofpage, MADV_SEQUENTIAL);
	//mapeo = (char *) mmap(NULL, 536870912, PROT_READ, MAP_SHARED, archivo,0);
	return archivo;
}

void leerSector(t_chs *chsActual, char* buffer, int fd, uint16_t retardo) {

	char *dataAux,bufferAux[512];
	uint16_t sizeofpage, offset;
	uint32_t NroPagina;

	sizeofpage = getpagesize();
	NroPagina = (obtenerCHSlog(chsActual) / 8) * sizeofpage; // Cociente de la division //
	offset = (obtenerCHSlog(chsActual) % 8) * BLOQUE; // Resto de la division //
	dataAux = (char *) mmap(NULL, sizeofpage, PROT_READ, MAP_SHARED, fd,NroPagina);

	memcpy(bufferAux, dataAux + offset, BLOQUE);
	munmap(dataAux, sizeofpage);
	actualizarCHS(chsActual,1);/*ACTUALIZA POS*/
	memcpy(buffer, bufferAux,BLOQUE);

	usleep(retardo*1000); //aca cambiamos a usleep
}

void escribirSector(t_chs *chsActual,char* buffer, int fd, uint16_t retardo) {

	char *dataAux = NULL;
	uint16_t sizeofpage, offset;
	uint32_t NroPagina;

	sizeofpage = getpagesize();
	NroPagina = (obtenerCHSlog(chsActual) / 8) * sizeofpage; // Cociente de la division //
	offset = (obtenerCHSlog(chsActual) % 8) * BLOQUE; // Resto de la division //

	dataAux = (char *) mmap(NULL, sizeofpage, PROT_READ | PROT_WRITE
	, MAP_SHARED, fd, NroPagina);

	memcpy(buffer + offset, buffer, BLOQUE);

	usleep(retardo*1000); //aca tambien se cambio a usleep

	msync(dataAux, sizeofpage, MS_SYNC);
	munmap(dataAux, sizeofpage);

	setCHSActual(actualizarCHS(chsActual,1));
}


